/**
 * 
 */
package control.mapping;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import command.*;

/**
 * @author FRED
 * 
 */
public class ControllerMapping {

	/*
	 * stock le mapping
	 */
	HashMap<String, Command> mapping;

	/*
	 * chemin et nom du fichier xml de commandes
	 */
	private String commandFileNamePath;

	
	/**
	 * @param commandFileName
	 */
	public ControllerMapping(String commandFileName) {
		super();
		this.commandFileNamePath = commandFileName;
		this.mapping = new HashMap<String, Command>();
		this.load(commandFileName);//chargement du mapping du fichier
	}



	/**
	 * @return the mapping
	 */
	public HashMap<String, Command> getMapping() {
		return mapping;
	}

//	/**
//	 * @param mapping
//	 *            the mapping to set
//	 */
//	public void setMapping(HashMap<String, Command> mapping) {
//		this.mapping = mapping;
//	}

	

	private void load(String commandFileNamePath) {
		// lecture d'un document XML par dom4j
		SAXReader reader = new SAXReader();
		Document document;
		
		try {
			// lecture du fichier xml
			document = reader.read(new File(commandFileNamePath));
			// élément racine du doc
			Element root = document.getRootElement();
			// itérateur pour le parcours du doc
			Iterator<Element> it = root.elementIterator();

			// boucle de parcours des eleves
			while (it.hasNext()) {
				// récupération et création des commandes
				// récupère la commande suivante
				Element command = it.next();
				// récupère ses attributs
				List<Element> attributs = command.elements();
				
				// création des élèments la HashMap - parcours des attributs
				String name = ""; Command action = null;
				for (Element element : attributs) {
					if ("name".equals(element.getName())) {
						name = element.getTextTrim();
						// pour ne pas continuer l'exploration
						continue;
					}
					if ("action".equals(element.getName())) {
						action = getActionCommand(element.getTextTrim());
						// pour ne pas continuer l'exploration
						continue;					
					}
				}

				// ajout à la map
				mapping.put(name, action);
			}

		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	/**
	 * @return the commandFileNamePath
	 */
	public String getCommandFileNamePath() {
		return commandFileNamePath;
	}



	/**
	 * @param commandFileNamePath the commandFileNamePath to set
	 */
	public void setCommandFileNamePath(String commandFileNamePath) {
		this.commandFileNamePath = commandFileNamePath;
	}



	private Command getActionCommand(String actionName){
		Command actionCommand = null;
		try {
			Class<?> c = Class.forName("command.actions."+actionName);
		    actionCommand = (Command) c.newInstance();
//			Method[] var = Class.forName(actionName).getMethods();
//			for (Method method : var) {
//				if ("execute".equalsIgnoreCase(method.getName())) {
//					System.out.println(method.invoke(t, (Object[])null));
//				}
//			}

		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return actionCommand;
	}

}
